package com.zenithmind.chat.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 群组状态枚举 - 遵循开闭原则
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
public enum GroupStatus {
    
    /**
     * 禁用
     */
    DISABLED(0, "禁用"),
    
    /**
     * 启用
     */
    ENABLED(1, "启用"),
    
    /**
     * 审核中
     */
    REVIEWING(2, "审核中"),
    
    /**
     * 已解散
     */
    DISSOLVED(3, "已解散"),
    
    /**
     * 已封禁
     */
    BANNED(4, "已封禁");

    /**
     * 状态码 - 用于数据库存储
     */
    @EnumValue
    @JsonValue
    private final Integer code;

    /**
     * 状态描述
     */
    private final String description;

    /**
     * 构造函数
     */
    GroupStatus(Integer code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据状态码获取枚举
     * 
     * @param code 状态码
     * @return 对应的枚举值
     */
    public static GroupStatus fromCode(Integer code) {
        if (code == null) {
            return ENABLED;
        }
        
        for (GroupStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        
        throw new IllegalArgumentException("未知的群组状态码: " + code);
    }

    /**
     * 检查是否为启用状态
     * 
     * @return 是否启用
     */
    public boolean isEnabled() {
        return this == ENABLED;
    }

    /**
     * 检查是否为禁用状态
     * 
     * @return 是否禁用
     */
    public boolean isDisabled() {
        return this == DISABLED;
    }

    /**
     * 检查是否正在审核
     * 
     * @return 是否正在审核
     */
    public boolean isReviewing() {
        return this == REVIEWING;
    }

    /**
     * 检查是否已解散
     * 
     * @return 是否已解散
     */
    public boolean isDissolved() {
        return this == DISSOLVED;
    }

    /**
     * 检查是否已封禁
     * 
     * @return 是否已封禁
     */
    public boolean isBanned() {
        return this == BANNED;
    }

    /**
     * 检查群组是否可用
     * 
     * @return 是否可用
     */
    public boolean isAvailable() {
        return this == ENABLED || this == REVIEWING;
    }
}
